﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Telerik.WinControls.UI;
using OwnZTec.LojaDelivery.Data;

namespace OwnZTec.LojaDelivery.UI.WinForms
{
    public partial class FrmImprimeDiario : OwnZForm
    {
        #region -- Membros e Construtores -------------------------------------------------------------------------------------------------

        public tbVenda Venda
        {
            get;
            set;
        }
        public tbVenda VendaAux
        {
            get;
            set;
        }
        public tbVendaDetalhe VendaDet
        {
            get;
            set;
        }

        public FrmImprimeDiario()
        {
            InitializeComponent();
        }


        private void FrmImprimeDiario_Load(object sender, EventArgs e)
        {
            carregado = false;

            AtualizarGrid();

            Contexto.MainForm.Cursor = Cursors.Arrow;
            carregado = true;
        }

        private bool carregado;

        #endregion

        #region -- Eventos ----------------------------------------------------------------------------------------------------------------

        #endregion


        #region -- Metodos ----------------------------------------------------------------------------------------------------------------
        private List<VendasDiario_Grid> lista;
        public void AtualizarGrid()
        {
            Cursor = Cursors.WaitCursor;
            lista = MontaGridLista(Contexto.Db.tbVendas.ToList().Where(p => p.flgAutomatica == true));

            gvComandas.DataSource = lista;

            Cursor = Cursors.Arrow;

        }

        private List<VendasDiario_Grid> MontaGridLista(IEnumerable<Data.tbVenda> objectSet)
        {
            List<VendasDiario_Grid> retorno = new List<VendasDiario_Grid>();
            VendasDiario_Grid det = new VendasDiario_Grid();
            foreach (var item in objectSet.ToList())
            {
                det = new VendasDiario_Grid();
                det.idVenda = item.idVenda;
                det.idCliente = item.idCliente;
                det.Data = (DateTime)item.dtUltimaImpressao;
                det.Cliente = Contexto.Db.tbClientes.First(p => p.idCliente == item.idCliente).desCliente;
                det.Qtde = item.qtdeTotal;
                det.Valor = item.valorVenda.ToString("C");
                retorno.Add(det);
            }

            return retorno;
        }

        #endregion

        private void gvComandas_DoubleClick(object sender, EventArgs e)
        {
            //Visualizar o pedido

            if (gvComandas.SelectedRows.Count != 1)
                return;


            int Pedido = Convert.ToInt32(gvComandas.SelectedRows[0].Cells["idVenda"].Value.ToString());

            StringBuilder sb = MontaImpressao(Pedido);

            var frm = new FrmMostraTela
            {
                Pai = this,
                sbImprime = sb
            };
            frm.ShowDialog();
        }

        private StringBuilder MontaImpressao(int idPedido)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("PEDIDO DIARIO");
            sb.AppendLine("=========================================");
            int idCliente = Contexto.Db.tbVendas.First(p => p.idVenda == idPedido).idCliente;
            sb.AppendLine("Cliente : " + Contexto.Db.tbClientes.First(p => p.idCliente == idCliente).desCliente);
            sb.AppendLine("Endereco: " + Contexto.Db.tbClientes.First(p => p.idCliente == idCliente).Endereco);
            sb.Append(", " + Contexto.Db.tbClientes.First(p => p.idCliente == idCliente).Numero);
            //sb.AppendLine("Data da Venda: " + Contexto.Db.tbVendas.First(p => p.idVenda == idPedido).dtVenda.ToString("dd/MM/yyyy"));
            sb.AppendLine("=========================================");

            sb.AppendLine("Cod    Descricao do Salgado");
            sb.AppendLine("          Qtde     Unit R$       Total R$");
            sb.AppendLine("=========================================");

            //Lopping para pegar os detalhes

            foreach (var item in Contexto.Db.tbVendaDetalhes.Where(p => p.idVenda == idPedido).ToList())
            {
                string zeros = string.Empty;
                //Código Produto e Descrição
                //sb.AppendLine("0004    ESFIHA DE CARNE");
                if (item.idProduto.ToString().Length < 4)
                {
                    for (int i = 0; i <= (4 - item.idProduto.ToString().Length); i++)
                    {
                        zeros += "0";
                    }
                    sb.AppendLine(zeros + item.idProduto + "    " + Contexto.Db.tbProdutoes.First(p => p.idProduto == item.idProduto).desNomeProduto.ToUpper());
                }
                else
                    sb.AppendLine(item.idProduto + "    " + Contexto.Db.tbProdutoes.First(p => p.idProduto == item.idProduto).desNomeProduto.ToUpper());

                zeros = string.Empty;
                //Qtde, Valor Unitário e Valor Total
                //sb.AppendLine("           3 x      1,25       =    3,75");
                sb.Append(("           ").Substring(item.qtde.ToString().Length - 1));
                sb.Append(item.qtde.ToString());
                sb.Append(" x");
                sb.Append(("      ").Substring(item.valorItem.ToString().Length - 4));
                sb.Append(item.valorItem.ToString());
                sb.Append("       =");
                sb.Append(("    ").Substring(item.valorTotal.ToString().Length - 4));
                sb.Append(item.valorTotal.ToString());
                sb.AppendLine("");
            }

            sb.AppendLine("=========================================");
            sb.AppendLine("Qtde Total: " + Contexto.Db.tbVendas.First(p => p.idVenda == idPedido).qtdeTotal.ToString() + "                 =  " + Contexto.Db.tbVendas.First(p => p.idVenda == idPedido).valorVenda.ToString("C"));
            sb.AppendLine("Desconto da Nota : " + Contexto.Db.tbVendas.First(p => p.idVenda == idPedido).valorDesconto.ToString("C"));
            sb.AppendLine("Acrescimo da Nota: " + Contexto.Db.tbVendas.First(p => p.idVenda == idPedido).valorFrete.ToString("C"));
            sb.AppendLine("");
            sb.AppendLine("****** Total da Comanda: " + Contexto.Db.tbVendas.First(p => p.idVenda == idPedido).valorVenda.ToString("C") + " ******");
            sb.AppendLine("");
            sb.AppendLine("================== FIM ==================");

            return sb;
        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {
            bool emitido = false;
            int Pedido = 0;
            List<VendasDiario_Grid> listaGrid = ((List<VendasDiario_Grid>)gvComandas.DataSource).Where(p => p.Imprime == true).ToList();

            if (listaGrid.Where(p => p.Imprime == true).Count() == 0)
            {
                MessageBox.Show("Não há registros selecionados!", "Gerar Comanda", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }


            foreach (VendasDiario_Grid item in listaGrid)
            {
                if (verificaData(item))
                {
                    emitido = true;
                    Pedido = item.idVenda;

                    VendaAux = Contexto.Db.tbVendas.First(p => p.idVenda == Pedido);
                    VendaAux.dtUltimaImpressao = DateTime.Now;
                    Contexto.Db.SaveChanges();

                    Venda = new tbVenda();
                    //Verificar qual é a última venda e a data. Se for ano posterior, entra como 1, senão, segue a numeração.
                    if (Contexto.Db.tbVendas.Count() > 0)
                    {
                        int anoAnterior = Contexto.Db.tbVendas.ToList().Last().dtVenda.Year;
                        int vendaAnterior = Contexto.Db.tbVendas.ToList().Last().numeroVenda;
                        if (anoAnterior >= DateTime.Now.Year)
                            Venda.numeroVenda = vendaAnterior + 1;
                        else
                            Venda.numeroVenda = 1;
                    }
                    else
                        Venda.numeroVenda = 1;

                    Venda.idCliente = VendaAux.idCliente;
                    Venda.dtVenda = DateTime.Now;
                    Venda.qtdeTotal = VendaAux.qtdeTotal;
                    Venda.valorVenda = VendaAux.valorVenda;
                    Venda.statusVenda = "A";
                    Venda.idUsuario = Contexto.idUsuarioLogado;
                    Venda.flgAutomatica = false;
                    Venda.valorFrete = VendaAux.valorFrete;
                    Venda.valorDesconto = VendaAux.valorDesconto;
                    Venda.dtUltimaImpressao = DateTime.Now;

                    Contexto.Db.tbVendas.AddObject(Venda);

                    Contexto.Db.SaveChanges();

                    int ID = Venda.idVenda;

                    //Gravando Detalhes
                    List<tbVendaDetalhe> lista = Contexto.Db.tbVendaDetalhes.Where(p => p.idVenda == Pedido).ToList();
                    foreach (tbVendaDetalhe vD in lista)
                    {
                        VendaDet = new tbVendaDetalhe();
                        VendaDet.idVenda = ID;
                        VendaDet.idProduto = vD.idProduto;
                        VendaDet.qtde = vD.qtde;
                        VendaDet.valorItem = vD.valorItem;
                        VendaDet.valorTotal = vD.valorTotal;
                        Contexto.Db.tbVendaDetalhes.AddObject(VendaDet);
                    }

                    Contexto.Db.SaveChanges();
                }
            }
            AtualizarGrid();
            if (emitido)
                MessageBox.Show("Pedidos gerados", "Gerar Pedido", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private bool verificaData(VendasDiario_Grid item)
        {
            if (item.Data.ToString("dd/MM/yyyy") == DateTime.Now.ToString("dd/MM/yyyy"))
            {
                DialogResult dr = MessageBox.Show("Pedido do cliente "+item.Cliente+" já foi impresso hoje.\nDeseja imprimir novamente?", "Gerar Comanda", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (dr != DialogResult.Yes)
                    return false;
            }
            return true;
        }

        private void gvComandas_CommandCellClick(object sender, EventArgs e)
        {
            int Pedido = Convert.ToInt32(gvComandas.SelectedRows[0].Cells["idVenda"].Value.ToString());

            Venda = Contexto.Db.tbVendas.First(p => p.idVenda == Pedido);

            Venda.flgAutomatica = false;

            Contexto.Db.SaveChanges();

            AtualizarGrid();
        }

        private void cmdAtualizar_Click(object sender, EventArgs e)
        {
            AtualizarGrid();
        }
    }

    public class VendasDiario_Grid
    {
        public bool Imprime { get; set; }
        public int idVenda { get; set; }
        public DateTime Data { get; set; }
        public int idCliente { get; set; }
        public string Cliente { get; set; }
        public int Qtde { get; set; }
        public string Valor { get; set; }
    }
}
